import type { BracketLeftType, BracketRightType } from "../base/Bracket/types";
import type { OperatorType } from "../base/Operator/types";
import { enterItemsEnum } from "./enum";
/**
 * 中缀表达式数组中的元素类型
 */
export type expressionItemsType = BracketLeftType | BracketRightType | OperatorType | number;

/**
 * 括号和运算符实例的联合类型
 */
export type Bracket_OperatorType = BracketLeftType | BracketRightType | OperatorType;

/**
 * 记录用户键盘输入的每个元素
 */
export type enterItemsType = BracketLeftType | BracketRightType | OperatorType | string;

/**
 * 寄存当前输入情况的实例的类型
 */
export interface TypingRegisterType {
    tryPush(enterItem: enterItemsType): TryPush_PopResultType;
    tryPop(): void;
    isEmpty(): boolean;
    clear(): void;
    /**
     * 获取正在输入（栈）的内容，并打包为中缀表达式中的一个元素
     * @returns 中缀表达式中的元素，如果是运算符，则返回其地址；是数字返回转为float类型的数字；没有内容返回undefined
     */
    getPacket(): expressionItemsType | undefined;
    /**
     * 先清空栈，是getPacket返回的值，可重新放入输入栈里
     */
    unPacket(packet: expressionItemsType): void;
    getItems(): Array<enterItemsType>;
    getCurrentType(): enterItemsEnum;
}

/**
 * 寄存器trypPush实例方法调用返回值
 */
export interface TryPush_PopResultType {
    readonly isDone: boolean;
    readonly msg?: string;
}